package com.nyist.myticket.web;

import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONObject;
import com.nyist.myticket.core.utils.PayUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.Map;
import java.util.Set;

/**
 * @author yangxiaogen
 * @date 2020/12/31 18:36
 */
@Slf4j
@RestController
public class WebController {

    @Value("${payFee.source}")
    private String source;// 请求商城方 来源

    @RequestMapping("/getYml")
    public String getYml() {
        String getSource = source;
        System.out.println(getSource);
        return getSource;
    }

    public static void main(String[] args) {
        JSONObject reqParam = new JSONObject(true);
        reqParam.set("channelNo", "feeConfigDto.getChannelNo()");// 渠道编号
        reqParam.set("mobile", "mobile");// 手机号码
        reqParam.set("notifyUrl", "notifyWyUrl");// 异步通知地址
        reqParam.set("payAmount", "feeConfigDto.getAdditionalAmount()");// 支付金额：单位（元）
        reqParam.set("payMethod", "minipro");// 支付方式：minipro小程序；
        reqParam.set("productId", "feeConfigDto.getProductId()");// 商品编号
        reqParam.set("requestTime", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));// 请求时间：yyyy-MM-dd hh24:mi:ss
        reqParam.set("subAppid", "appid");// 小程序appid
        reqParam.set("subOpenid", "openid");// 用户openid
        reqParam.set("systemCode", "source");// 来源
        reqParam.set("tradeDate", DateUtil.format(new Date(), "yyyyMMdd"));// 交易日期：yyyyMMdd
        reqParam.set("tradeNo", "detailId");// 请求流水号
        reqParam.set("tradeType", "01");// 交易类型：01支付；
        reqParam.set("version", "1.0.0");// 版本号：1.0.0（缺省）

        String toMd5 = jsonToSortString(reqParam);
        String sign = createSing(toMd5);
        reqParam.set("sign", sign);// 报文签名
        /**
         * 请求商城方
         */
        log.info("=====>xcxPayreqParam: {}", reqParam.toString());
    }

    private static String jsonToSortString(JSONObject jsonObject){

        StringBuilder stringBuilder = new StringBuilder();

        for (Map.Entry<String, Object> entry : jsonObject.entrySet()){
            stringBuilder.append(entry.getKey());
            stringBuilder.append(entry.getValue());
        }
        log.info("====> 请求商城方,请求内容排序{}",stringBuilder.toString());
        return stringBuilder.toString();
    }

    private static String createSing(String data) {
        // 获取配置文件中的 密钥
        String getSecretKey = "jkMAyyY5pXCsnpxX";
        String toMD5 = getSecretKey + data + getSecretKey;
        log.info("====> 请求商城方,即将进行 md5加密 的要素{}",toMD5);
        String md5Key = null;
        try {
            md5Key = PayUtil.md5(toMD5);
        } catch (Exception e) {
            e.printStackTrace();
        }
        log.info("====> 请求商城方,进行 md5加密 完成 的要素{}",md5Key);
        String sign = md5Key.toUpperCase();
        log.info("====> 根据商城要求, MD5后的字符串全部转为大写 {}",sign);
        return sign;
    }
}
